home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / distutils / command / build_ext.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  17KB  |  476 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. """distutils.command.build_ext
  5.  
  6. Implements the Distutils 'build_ext' command, for building extension
  7. modules (currently limited to C extensions, should accommodate C++
  8. extensions ASAP)."""
  9. __revision__ = '$Id: build_ext.py,v 1.98 2004/11/10 22:23:15 loewis Exp $'
  10. import sys
  11. import os
  12. import string
  13. import re
  14. from types import *
  15. from distutils.core import Command
  16. from distutils.errors import *
  17. from distutils.sysconfig import customize_compiler, get_python_version
  18. from distutils.dep_util import newer_group
  19. from distutils.extension import Extension
  20. from distutils import log
  21. extension_name_re = re.compile('^[a-zA-Z_][a-zA-Z_0-9]*(\\.[a-zA-Z_][a-zA-Z_0-9]*)*$')
  22.  
  23. def show_compilers():
  24.     show_compilers = show_compilers
  25.     import distutils.ccompiler
  26.     show_compilers()
  27.  
  28.  
  29. class build_ext(Command):
  30.     description = 'build C/C++ extensions (compile/link to build directory)'
  31.     sep_by = " (separated by '%s')" % os.pathsep
  32.     user_options = [
  33.         ('build-lib=', 'b', 'directory for compiled extension modules'),
  34.         ('build-temp=', 't', 'directory for temporary files (build by-products)'),
  35.         ('inplace', 'i', 'ignore build-lib and put compiled extensions into the source ' + 'directory alongside your pure Python modules'),
  36.         ('include-dirs=', 'I', 'list of directories to search for header files' + sep_by),
  37.         ('define=', 'D', 'C preprocessor macros to define'),
  38.         ('undef=', 'U', 'C preprocessor macros to undefine'),
  39.         ('libraries=', 'l', 'external C libraries to link with'),
  40.         ('library-dirs=', 'L', 'directories to search for external C libraries' + sep_by),
  41.         ('rpath=', 'R', 'directories to search for shared C libraries at runtime'),
  42.         ('link-objects=', 'O', 'extra explicit link objects to include in the link'),
  43.         ('debug', 'g', 'compile/link with debugging information'),
  44.         ('force', 'f', 'forcibly build everything (ignore file timestamps)'),
  45.         ('compiler=', 'c', 'specify the compiler type'),
  46.         ('swig-cpp', None, 'make SWIG create C++ files (default is C)'),
  47.         ('swig-opts=', None, 'list of SWIG command line options'),
  48.         ('swig=', None, 'path to the SWIG executable')]
  49.     boolean_options = [
  50.         'inplace',
  51.         'debug',
  52.         'force',
  53.         'swig-cpp']
  54.     help_options = [
  55.         ('help-compiler', None, 'list available compilers', show_compilers)]
  56.     
  57.     def initialize_options(self):
  58.         self.extensions = None
  59.         self.build_lib = None
  60.         self.build_temp = None
  61.         self.inplace = 0
  62.         self.package = None
  63.         self.include_dirs = None
  64.         self.define = None
  65.         self.undef = None
  66.         self.libraries = None
  67.         self.library_dirs = None
  68.         self.rpath = None
  69.         self.link_objects = None
  70.         self.debug = None
  71.         self.force = None
  72.         self.compiler = None
  73.         self.swig = None
  74.         self.swig_cpp = None
  75.         self.swig_opts = None
  76.  
  77.     
  78.     def finalize_options(self):
  79.         sysconfig = sysconfig
  80.         import distutils
  81.         self.set_undefined_options('build', ('build_lib', 'build_lib'), ('build_temp', 'build_temp'), ('compiler', 'compiler'), ('debug', 'debug'), ('force', 'force'))
  82.         if self.package is None:
  83.             self.package = self.distribution.ext_package
  84.         
  85.         self.extensions = self.distribution.ext_modules
  86.         py_include = sysconfig.get_python_inc()
  87.         plat_py_include = sysconfig.get_python_inc(plat_specific = 1)
  88.         if self.include_dirs is None:
  89.             if not self.distribution.include_dirs:
  90.                 pass
  91.             self.include_dirs = []
  92.         
  93.         if type(self.include_dirs) is StringType:
  94.             self.include_dirs = string.split(self.include_dirs, os.pathsep)
  95.         
  96.         self.include_dirs.append(py_include)
  97.         if plat_py_include != py_include:
  98.             self.include_dirs.append(plat_py_include)
  99.         
  100.         if type(self.libraries) is StringType:
  101.             self.libraries = [
  102.                 self.libraries]
  103.         
  104.         if self.libraries is None:
  105.             self.libraries = []
  106.         
  107.         if self.library_dirs is None:
  108.             self.library_dirs = []
  109.         elif type(self.library_dirs) is StringType:
  110.             self.library_dirs = string.split(self.library_dirs, os.pathsep)
  111.         
  112.         if self.rpath is None:
  113.             self.rpath = []
  114.         elif type(self.rpath) is StringType:
  115.             self.rpath = string.split(self.rpath, os.pathsep)
  116.         
  117.         if os.name == 'nt':
  118.             self.library_dirs.append(os.path.join(sys.exec_prefix, 'libs'))
  119.             if self.debug:
  120.                 self.build_temp = os.path.join(self.build_temp, 'Debug')
  121.             else:
  122.                 self.build_temp = os.path.join(self.build_temp, 'Release')
  123.             self.include_dirs.append(os.path.join(sys.exec_prefix, 'PC'))
  124.             self.library_dirs.append(os.path.join(sys.exec_prefix, 'PCBuild'))
  125.         
  126.         if os.name == 'os2':
  127.             self.library_dirs.append(os.path.join(sys.exec_prefix, 'Config'))
  128.         
  129.         if sys.platform[:6] == 'cygwin' or sys.platform[:6] == 'atheos':
  130.             if string.find(sys.executable, sys.exec_prefix) != -1:
  131.                 self.library_dirs.append(os.path.join(sys.prefix, 'lib', 'python' + get_python_version(), 'config'))
  132.             else:
  133.                 self.library_dirs.append('.')
  134.         
  135.         if self.define:
  136.             defines = string.split(self.define, ',')
  137.             self.define = map((lambda symbol: (symbol, '1')), defines)
  138.         
  139.         if self.undef:
  140.             self.undef = string.split(self.undef, ',')
  141.         
  142.         if self.swig_opts is None:
  143.             self.swig_opts = []
  144.         else:
  145.             self.swig_opts = self.swig_opts.split(' ')
  146.  
  147.     
  148.     def run(self):
  149.         new_compiler = new_compiler
  150.         import distutils.ccompiler
  151.         if not self.extensions:
  152.             return None
  153.         
  154.         if self.distribution.has_c_libraries():
  155.             build_clib = self.get_finalized_command('build_clib')
  156.             if not build_clib.get_library_names():
  157.                 pass
  158.             self.libraries.extend([])
  159.             self.library_dirs.append(build_clib.build_clib)
  160.         
  161.         self.compiler = new_compiler(compiler = self.compiler, verbose = self.verbose, dry_run = self.dry_run, force = self.force)
  162.         customize_compiler(self.compiler)
  163.         if self.include_dirs is not None:
  164.             self.compiler.set_include_dirs(self.include_dirs)
  165.         
  166.         if self.define is not None:
  167.             for name, value in self.define:
  168.                 self.compiler.define_macro(name, value)
  169.             
  170.         
  171.         if self.undef is not None:
  172.             for macro in self.undef:
  173.                 self.compiler.undefine_macro(macro)
  174.             
  175.         
  176.         if self.libraries is not None:
  177.             self.compiler.set_libraries(self.libraries)
  178.         
  179.         if self.library_dirs is not None:
  180.             self.compiler.set_library_dirs(self.library_dirs)
  181.         
  182.         if self.rpath is not None:
  183.             self.compiler.set_runtime_library_dirs(self.rpath)
  184.         
  185.         if self.link_objects is not None:
  186.             self.compiler.set_link_objects(self.link_objects)
  187.         
  188.         self.build_extensions()
  189.  
  190.     
  191.     def check_extensions_list(self, extensions):
  192.         """Ensure that the list of extensions (presumably provided as a
  193.         command option 'extensions') is valid, i.e. it is a list of
  194.         Extension objects.  We also support the old-style list of 2-tuples,
  195.         where the tuples are (ext_name, build_info), which are converted to
  196.         Extension instances here.
  197.  
  198.         Raise DistutilsSetupError if the structure is invalid anywhere;
  199.         just returns otherwise.
  200.         """
  201.         if type(extensions) is not ListType:
  202.             raise DistutilsSetupError, "'ext_modules' option must be a list of Extension instances"
  203.         
  204.         for i in range(len(extensions)):
  205.             ext = extensions[i]
  206.             if isinstance(ext, Extension):
  207.                 continue
  208.             
  209.             (ext_name, build_info) = ext
  210.             log.warn("old-style (ext_name, build_info) tuple found in ext_modules for extension '%s'-- please convert to Extension instance" % ext_name)
  211.             if type(ext) is not TupleType and len(ext) != 2:
  212.                 raise DistutilsSetupError, "each element of 'ext_modules' option must be an Extension instance or 2-tuple"
  213.             
  214.             if not type(ext_name) is StringType and extension_name_re.match(ext_name):
  215.                 raise DistutilsSetupError, "first element of each tuple in 'ext_modules' must be the extension name (a string)"
  216.             
  217.             if type(build_info) is not DictionaryType:
  218.                 raise DistutilsSetupError, "second element of each tuple in 'ext_modules' must be a dictionary (build info)"
  219.             
  220.             ext = Extension(ext_name, build_info['sources'])
  221.             for key in ('include_dirs', 'library_dirs', 'libraries', 'extra_objects', 'extra_compile_args', 'extra_link_args'):
  222.                 val = build_info.get(key)
  223.                 if val is not None:
  224.                     setattr(ext, key, val)
  225.                     continue
  226.             
  227.             ext.runtime_library_dirs = build_info.get('rpath')
  228.             if build_info.has_key('def_file'):
  229.                 log.warn("'def_file' element of build info dict no longer supported")
  230.             
  231.             macros = build_info.get('macros')
  232.             if macros:
  233.                 ext.define_macros = []
  234.                 ext.undef_macros = []
  235.                 for macro in macros:
  236.                     None if type(macro) is TupleType else 1
  237.                     if len(macro) == 2:
  238.                         ext.define_macros.append(macro)
  239.                         continue
  240.                 
  241.             
  242.             extensions[i] = ext
  243.         
  244.  
  245.     
  246.     def get_source_files(self):
  247.         self.check_extensions_list(self.extensions)
  248.         filenames = []
  249.         for ext in self.extensions:
  250.             filenames.extend(ext.sources)
  251.         
  252.         return filenames
  253.  
  254.     
  255.     def get_outputs(self):
  256.         self.check_extensions_list(self.extensions)
  257.         outputs = []
  258.         for ext in self.extensions:
  259.             fullname = self.get_ext_fullname(ext.name)
  260.             outputs.append(os.path.join(self.build_lib, self.get_ext_filename(fullname)))
  261.         
  262.         return outputs
  263.  
  264.     
  265.     def build_extensions(self):
  266.         self.check_extensions_list(self.extensions)
  267.         for ext in self.extensions:
  268.             self.build_extension(ext)
  269.         
  270.  
  271.     
  272.     def build_extension(self, ext):
  273.         sources = ext.sources
  274.         if sources is None or type(sources) not in (ListType, TupleType):
  275.             raise DistutilsSetupError, ("in 'ext_modules' option (extension '%s'), " + "'sources' must be present and must be " + 'a list of source filenames') % ext.name
  276.         
  277.         sources = list(sources)
  278.         fullname = self.get_ext_fullname(ext.name)
  279.         if self.inplace:
  280.             modpath = string.split(fullname, '.')
  281.             package = string.join(modpath[0:-1], '.')
  282.             base = modpath[-1]
  283.             build_py = self.get_finalized_command('build_py')
  284.             package_dir = build_py.get_package_dir(package)
  285.             ext_filename = os.path.join(package_dir, self.get_ext_filename(base))
  286.         else:
  287.             ext_filename = os.path.join(self.build_lib, self.get_ext_filename(fullname))
  288.         depends = sources + ext.depends
  289.         if not self.force or newer_group(depends, ext_filename, 'newer'):
  290.             log.debug("skipping '%s' extension (up-to-date)", ext.name)
  291.             return None
  292.         else:
  293.             log.info("building '%s' extension", ext.name)
  294.         sources = self.swig_sources(sources, ext)
  295.         if not ext.extra_compile_args:
  296.             pass
  297.         extra_args = []
  298.         macros = ext.define_macros[:]
  299.         for undef in ext.undef_macros:
  300.             macros.append((undef,))
  301.         
  302.         objects = self.compiler.compile(sources, output_dir = self.build_temp, macros = macros, include_dirs = ext.include_dirs, debug = self.debug, extra_postargs = extra_args, depends = ext.depends)
  303.         self._built_objects = objects[:]
  304.         if ext.extra_objects:
  305.             objects.extend(ext.extra_objects)
  306.         
  307.         if not ext.extra_link_args:
  308.             pass
  309.         extra_args = []
  310.         if not ext.language:
  311.             pass
  312.         language = self.compiler.detect_language(sources)
  313.         self.compiler.link_shared_object(objects, ext_filename, libraries = self.get_libraries(ext), library_dirs = ext.library_dirs, runtime_library_dirs = ext.runtime_library_dirs, extra_postargs = extra_args, export_symbols = self.get_export_symbols(ext), debug = self.debug, build_temp = self.build_temp, target_lang = language)
  314.  
  315.     
  316.     def swig_sources(self, sources, extension):
  317.         """Walk the list of source files in 'sources', looking for SWIG
  318.         interface (.i) files.  Run SWIG on all that are found, and
  319.         return a modified 'sources' list with SWIG source files replaced
  320.         by the generated C (or C++) files.
  321.         """
  322.         new_sources = []
  323.         swig_sources = []
  324.         swig_targets = { }
  325.         if self.swig_cpp:
  326.             log.warn('--swig-cpp is deprecated - use --swig-opts=-c++')
  327.         
  328.         if self.swig_cpp or '-c++' in self.swig_opts:
  329.             target_ext = '.cpp'
  330.         else:
  331.             target_ext = '.c'
  332.         for source in sources:
  333.             (base, ext) = os.path.splitext(source)
  334.             if ext == '.i':
  335.                 new_sources.append(base + '_wrap' + target_ext)
  336.                 swig_sources.append(source)
  337.                 swig_targets[source] = new_sources[-1]
  338.                 continue
  339.             new_sources.append(source)
  340.         
  341.         if not swig_sources:
  342.             return new_sources
  343.         
  344.         if not self.swig:
  345.             pass
  346.         swig = self.find_swig()
  347.         swig_cmd = [
  348.             swig,
  349.             '-python']
  350.         swig_cmd.extend(self.swig_opts)
  351.         if self.swig_cpp:
  352.             swig_cmd.append('-c++')
  353.         
  354.         if not self.swig_opts:
  355.             for o in extension.swig_opts:
  356.                 swig_cmd.append(o)
  357.             
  358.         
  359.         for source in swig_sources:
  360.             target = swig_targets[source]
  361.             log.info('swigging %s to %s', source, target)
  362.             self.spawn(swig_cmd + [
  363.                 '-o',
  364.                 target,
  365.                 source])
  366.         
  367.         return new_sources
  368.  
  369.     
  370.     def find_swig(self):
  371.         '''Return the name of the SWIG executable.  On Unix, this is
  372.         just "swig" -- it should be in the PATH.  Tries a bit harder on
  373.         Windows.
  374.         '''
  375.         if os.name == 'posix':
  376.             return 'swig'
  377.         elif os.name == 'nt':
  378.             for vers in ('1.3', '1.2', '1.1'):
  379.                 fn = os.path.join('c:\\swig%s' % vers, 'swig.exe')
  380.                 if os.path.isfile(fn):
  381.                     return fn
  382.                     continue
  383.             else:
  384.                 return 'swig.exe'
  385.         elif os.name == 'os2':
  386.             return 'swig.exe'
  387.         else:
  388.             raise DistutilsPlatformError, "I don't know how to find (much less run) SWIG on platform '%s'" % os.name
  389.  
  390.     
  391.     def get_ext_fullname(self, ext_name):
  392.         if self.package is None:
  393.             return ext_name
  394.         else:
  395.             return self.package + '.' + ext_name
  396.  
  397.     
  398.     def get_ext_filename(self, ext_name):
  399.         '''Convert the name of an extension (eg. "foo.bar") into the name
  400.         of the file from which it will be loaded (eg. "foo/bar.so", or
  401.         "foo\\bar.pyd").
  402.         '''
  403.         get_config_var = get_config_var
  404.         import distutils.sysconfig
  405.         ext_path = string.split(ext_name, '.')
  406.         if os.name == 'os2':
  407.             ext_path[len(ext_path) - 1] = ext_path[len(ext_path) - 1][:8]
  408.         
  409.         so_ext = get_config_var('SO')
  410.         if os.name == 'nt' and self.debug:
  411.             return apply(os.path.join, ext_path) + '_d' + so_ext
  412.         
  413.         return apply(os.path.join, ext_path) + so_ext
  414.  
  415.     
  416.     def get_export_symbols(self, ext):
  417.         '''Return the list of symbols that a shared extension has to
  418.         export.  This either uses \'ext.export_symbols\' or, if it\'s not
  419.         provided, "init" + module_name.  Only relevant on Windows, where
  420.         the .pyd file (DLL) must export the module "init" function.
  421.         '''
  422.         initfunc_name = 'init' + string.split(ext.name, '.')[-1]
  423.         if initfunc_name not in ext.export_symbols:
  424.             ext.export_symbols.append(initfunc_name)
  425.         
  426.         return ext.export_symbols
  427.  
  428.     
  429.     def get_libraries(self, ext):
  430.         """Return the list of libraries to link against when building a
  431.         shared extension.  On most platforms, this is just 'ext.libraries';
  432.         on Windows and OS/2, we add the Python library (eg. python20.dll).
  433.         """
  434.         if sys.platform == 'win32':
  435.             MSVCCompiler = MSVCCompiler
  436.             import distutils.msvccompiler
  437.             if not isinstance(self.compiler, MSVCCompiler):
  438.                 template = 'python%d%d'
  439.                 if self.debug:
  440.                     template = template + '_d'
  441.                 
  442.                 pythonlib = template % (sys.hexversion >> 24, sys.hexversion >> 16 & 255)
  443.                 return ext.libraries + [
  444.                     pythonlib]
  445.             else:
  446.                 return ext.libraries
  447.         elif sys.platform == 'os2emx':
  448.             template = 'python%d%d'
  449.             pythonlib = template % (sys.hexversion >> 24, sys.hexversion >> 16 & 255)
  450.             return ext.libraries + [
  451.                 pythonlib]
  452.         elif sys.platform[:6] == 'cygwin':
  453.             template = 'python%d.%d'
  454.             pythonlib = template % (sys.hexversion >> 24, sys.hexversion >> 16 & 255)
  455.             return ext.libraries + [
  456.                 pythonlib]
  457.         elif sys.platform[:6] == 'atheos':
  458.             sysconfig = sysconfig
  459.             import distutils
  460.             template = 'python%d.%d'
  461.             pythonlib = template % (sys.hexversion >> 24, sys.hexversion >> 16 & 255)
  462.             extra = []
  463.             for lib in sysconfig.get_config_var('SHLIBS').split():
  464.                 if lib.startswith('-l'):
  465.                     extra.append(lib[2:])
  466.                     continue
  467.                 extra.append(lib)
  468.             
  469.             return ext.libraries + [
  470.                 pythonlib,
  471.                 'm'] + extra
  472.         else:
  473.             return ext.libraries
  474.  
  475.  
  476.